package com.applet.addressbook.controller;

import com.applet.addressbook.service.AddressBookService;
import com.applet.context.AlibabaTTL;
import com.applet.entity.AddressBook;
import com.applet.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 地址簿 controller     // TODO  未使用dto接收数据，不好添加注解校验，如果使用需要改造，就这样也行
 */
@Slf4j
@Validated      //注解校验
@RestController
@RequestMapping("/user/addressBook")
public class AddressBookController {


    @Resource
    private AddressBookService addressBookService;



    /**
     * 地址簿管理
     *         新增用户名下的收货地址
     */
    @PostMapping
    public Result addUserAddressBook(@RequestBody AddressBook addressBook){
        log.info("地址簿管理 - 当前用户id: {},新增地址簿: {}", AlibabaTTL.threadLocalGet(), addressBook);
        addressBookService.addUserAddressBook(addressBook);
        return Result.success();
    }



    /**
     * 地址簿管理
     *         查询用户名下的所有收货地址  参数可选
     */
    @GetMapping("/list")
    public Result queryUserAddressBookList(Long userId){
        log.info("地址簿管理 - 查询当前用户id: {}名下的地址簿集合", userId);
        List<AddressBook> addressBookList = addressBookService.selectUserAddressBookList(userId);
        return Result.success(addressBookList);
    }



    /**
     * 地址簿管理
     *         查询用户名下的默认收货地址   参数可选
     */
    @GetMapping("/default")
    public Result<AddressBook> selectUserDefaultAddressBook(Long userId){
        log.info("地址簿管理 - 查询当前用户id: {}名下的默认收货地址", AlibabaTTL.threadLocalGet());
        AddressBook addressBook = addressBookService.getDefault(userId);
        return Result.success(addressBook);
    }



    /**
     * 地址簿管理
     *         设置用户名下的默认收货地址
     */
    @PutMapping("/default")
    public Result updateUserDefaultAddressBook(@RequestBody AddressBook addressBook){
        log.info("地址簿管理 - 设置当前地址簿id: {}为默认地址", addressBook.getId());
        addressBookService.setDefault(addressBook);
        return Result.success();
    }



    /**
     * 地址簿管理
     *          根据id查询收货地址
     */
    @GetMapping("/{id}")
    public Result<AddressBook> queryAddressBook(@PathVariable(name="id")Long id){
        log.info("地址簿管理 - 根据id: {}查询地址簿信息", id);
        AddressBook addressBook = addressBookService.selectAddressBookById(id);
        return Result.success(addressBook);
    }



    /**
     * 地址簿管理
     *          修改收货地址信息
     */
    @PutMapping
    public Result updateUserAddressBook(@RequestBody AddressBook addressBook){
        log.info("地址簿管理 - 修改用户id: {},地址簿id: {}的信息", AlibabaTTL.threadLocalGet(), addressBook.getId());
        addressBookService.updateAddressBook(addressBook);
        return Result.success();
    }



    /**
     * 地址簿管理
     *         删除用户名下的地址簿
     */
    @DeleteMapping
    public Result deleteUserAddressBook(@NotNull(message = "id为空") Long id){
        log.info("地址簿管理 - 删除用户id: {},地址簿id: {}的地址簿信息", AlibabaTTL.threadLocalGet(), id);
        addressBookService.deleteById(id);
        return Result.success();
    }



}
